
/**
 *
 * @author ebastos
 */
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import net.ucanaccess.jdbc.UcanaccessConnection;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;

public class DAOCategoria {

    public DAOCategoria() {
    }

    private BeanCategoria GetCategoria(ResultSet rs) throws Exception {
        try {
            if (rs.next()) {
                BeanCategoria categoria = new BeanCategoria();
                categoria.setID(rs.getInt("ID"));
                categoria.setNome(rs.getString("nome"));
                categoria.setCategoria_pai(rs.getInt("categoria_pai"));
                return categoria;
            } else {
                throw new Exception("Não retornou nenhuma linha.");
            }
        } catch (SQLException e) {
            throw new Exception(e.getMessage());
        }
    }

    private ArrayList<BeanCategoria> GetCategorias(ResultSet rs) throws Exception {
        try {
            BeanCategoria categoria;
            ArrayList<BeanCategoria> retorno = new ArrayList<>();
            while (rs.next()) {
                categoria = new BeanCategoria();
                categoria.setID(rs.getInt("ID"));
                categoria.setNome(rs.getString("nome"));
                categoria.setCategoria_pai(rs.getInt("categoria_pai"));
                retorno.add(categoria);
            }
            return retorno;
        } catch (SQLException e) {
            throw new Exception(e.getMessage());
        }
    }

    public BeanCategoria RetornaCategoria(int ID) throws Exception {
        try (UcanaccessConnection conn = ConexaoBancoDeDados.getConexao()) {
            String sql;
            sql = "SELECT * FROM categoria WHERE ID = ?;";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, String.valueOf(ID));

            ResultSet rs = ps.executeQuery();
            return GetCategoria(rs);
        } catch (SQLException e) {
            throw new Exception(e.getMessage());
        }
    }

    public ArrayList<BeanCategoria> RetornaCategorias() throws Exception {
        try (UcanaccessConnection conn = ConexaoBancoDeDados.getConexao()) {
            String sql;
            sql = "SELECT * FROM categoria WHERE categoria_pai IS NULL;";
            PreparedStatement ps = conn.prepareStatement(sql);

            ResultSet rs = ps.executeQuery();
            return GetCategorias(rs);
        } catch (SQLException e) {
            throw new Exception(e.getMessage());
        }
    }

    public void Insere(BeanCategoria categoria) throws Exception {
        try (UcanaccessConnection conn = ConexaoBancoDeDados.getConexao()) {
            String sql;
            sql = "INSERT INTO categoria (nome, categoria_pai) VALUES (?, ?);";
            try (PreparedStatement ps = conn.prepareStatement(sql)) {
                ps.setString(1, String.valueOf(categoria.getNome()));
                if (categoria.getCategoria_pai() != 0) {
                    ps.setInt(2, categoria.getCategoria_pai());
                } else {
                    ps.setNull(2, Types.INTEGER);
                }
                ps.executeUpdate();
            }
        } catch (SQLException e) {
            throw new Exception(e.getMessage());
        }
    }

    public void Atualiza(BeanCategoria categoria) throws Exception {
        try (UcanaccessConnection conn = ConexaoBancoDeDados.getConexao()) {
            String sql;
            sql = "UPDATE categoria SET nome = ?, categoria_pai = ? WHERE ID = ?;";
            try (PreparedStatement ps = conn.prepareStatement(sql)) {
                ps.setString(1, String.valueOf(categoria.getNome()));
                if (categoria.getCategoria_pai() != 0) {
                    ps.setInt(2, categoria.getCategoria_pai());
                } else {
                    ps.setNull(2, Types.INTEGER);
                }
                ps.setInt(3, categoria.getID());
                ps.executeUpdate();
            }
        } catch (SQLException e) {
            throw new Exception(e.getMessage());
        }
    }

    public void Deleta(BeanCategoria categoria) throws Exception {
        try (UcanaccessConnection conn = ConexaoBancoDeDados.getConexao()) {
            String sql;
            sql = "DELETE FROM categoria WHERE ID = ?;";
            try (PreparedStatement ps = conn.prepareStatement(sql)) {
                ps.setInt(1, categoria.getID());
                ps.executeUpdate();
            }
        } catch (SQLException e) {
            throw new Exception(e.getMessage());
        }
    }
}
